package edu.nf.dbutil.result;

import edu.nf.dbutil.ResultSetHandler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 抽象的集合结果集处理器
 * @author yang
 * @date 2024-05-10
 * 由于要对多条数据进行处理，所以实现 ResultSetHandler 接口的泛型用 List<T>
 */
public abstract class AbstractListHandler<T> implements ResultSetHandler<List<T>> {
    /**
     * 处理集合（使用模板方法模式）
     * @param rs 结果集对象
     * @return 集合结果集
     * @throws SQLException
     * （由于不知大返回的集合类型，所以使用泛型 T 代替）
     * 初始化List<T>集合
     * 循环遍历结果集对象，并根据业务需要，通过 handleRow(rs) 方法交由子类去实现
     * 返回集合对象
     */
    @Override
    public List<T> handle(ResultSet rs) throws SQLException {
        List<T> list = new ArrayList<>();
        while (rs.next()) {
            //若判断有数据，则会调用方法
            list.add(handleRow(rs));
        }
        return list;
    }

    /**
     * 抽象行处理方法，交由子类做不同的实现
     * @param rs
     * @return
     */
    public abstract T handleRow(ResultSet rs) throws SQLException;
}
